데이터 인코딩 기법은 데이터 과학과 머신러닝 프로세스에서 매우 중요한 전처리 단계 중 하나입니다. 실제 데이터는 텍스트, 범주형 값, 날짜, 기호 등 다양한 형태로 존재하지만, 머신러닝 모델은 일반적으로 수치형 데이터만을 입력으로 처리할 수 있습니다. 따라서 범주형 변수나 텍스트 데이터를 모델이 이해할 수 있는 수치 형태로 변환하는 과정이 바로 데이터 인코딩입니다. 이 문서에서는 대표적인 데이터 인코딩 기법들을 체계적으로 정리하고, 각 기법의 원리, 장단점, 사용 사례를 설명합니다.
개요
데이터 인코딩은 비수치형 데이터를 수치형으로 변환하여 머신러닝 모델의 학습과 예측을 가능하게 합니다. 특히 범주형 변수(categorical variable)는 종류에 따라 명목형(nominal, 순서 없음)과 순서형(ordinal, 순서 있음)으로 나뉘며, 각각에 적합한 인코딩 방식을 적용해야 합니다. 잘못된 인코딩은 모델의 성능 저하나 왜곡된 해석을 초래할 수 있으므로, 데이터의 특성과 사용하는 알고리즘을 고려한 신중한 선택이 필요합니다.
주요 인코딩 기법
1. 레이블 인코딩 (Label Encoding)
레이블 인코딩은 범주형 변수의 각 카테고리에 고유한 정수 값을 할당하는 방식입니다.
예시:
특징:
- 간단하고 메모리 효율적
- 순서형 데이터(예: 소 → 중 → 대)에 적합
- 명목형 데이터에 사용 시 의미 없는 순서를 모델이 오해할 수 있음
사용 예:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
colors = ['red', 'blue', 'green', 'red', 'blue']
encoded_colors = encoder.fit_transform(colors)
⚠️ 주의: 명목형 데이터에 적용 시 주의가 필요하며, 트리 기반 모델(예: Random Forest, XGBoost)에서만 상대적으로 안전하게 사용 가능.
2. 원-핫 인코딩 (One-Hot Encoding)
각 범주를 독립적인 이진 열(binary column)로 변환하는 기법입니다. 각 열은 특정 카테고리의 존재 여부를 1 또는 0으로 표시합니다.
예시:
색상 |
빨강 |
파랑 |
초록 |
빨강 |
1 |
0 |
0 |
파랑 |
0 |
1 |
0 |
초록 |
0 |
0 |
1 |
특징:
- 명목형 데이터에 이상적
- 더미 변수(dummy variable) 생성
- 카테고리 수가 많을 경우 차원 증가(curse of dimensionality) 문제 발생 가능
사용 예:
import pandas as pd
df = pd.DataFrame({'color': ['red', 'blue', 'green']})
one_hot = pd.get_dummies(df, columns=['color'])
✅ 장점: 모델이 범주 간 순서를 잘못 해석하지 않음
❌ 단점: 카테고리가 100개 이상이면 수백 개의 열이 생성되어 비효율적
3. 범주형 인코딩 (Target Encoding / Mean Encoding)
각 범주의 카테고리 값을 해당 카테고리에 속한 타겟 변수의 평균값으로 대체하는 기법입니다. 주로 회귀 또는 분류 문제에서 사용됩니다.
예시 (이진 분류):
지역 |
타겟 평균 (성공률) |
서울 |
0.75 |
부산 |
0.60 |
대구 |
0.45 |
특징:
- 고차원 데이터에 효과적
- 정보 누수(data leakage) 위험 존재 → 반드시 교차 검증(cross-validation)을 통해 학습/검증 데이터 분리 필요
- 범주 내 샘플 수가 적을 경우 과적합 위험
✅ 장점: 범주와 타겟 간 관계를 반영
❌ 단점: 오버피팅 가능, 구현 복잡도 ↑
4. 이진 인코딩 (Binary Encoding)
원-핫 인코딩과 레이블 인코딩의 중간 형태로, 먼저 레이블 인코딩을 수행한 후 그 정수를 이진수로 변환하고, 각 비트를 별도의 열로 분리합니다.
예시 (빨강=0 → 000, 파랑=1 → 001, 초록=2 → 010):
색상 |
비트1 |
비트2 |
비트3 |
빨강 |
0 |
0 |
0 |
파랑 |
0 |
0 |
1 |
초록 |
0 |
1 |
0 |
특징:
- 원-핫보다 차원이 작음 (log₂(n) 개의 열)
- 고차원 범주형 변수에 유리
- 범주 간 잠재적인 유사성 반영 가능
✅ 장점: 메모리 효율성과 정보 보존의 균형
✅ 활용: 고유값이 많은 범주형 변수 (예: 우편번호, 제품 코드)
5. 임베딩 (Embedding)
딥러닝 기반 인코딩 기법으로, 범주형 변수를 고정된 길이의 밀집 벡터(dense vector)로 변환합니다. 주로 자연어 처리(NLP)나 추천 시스템에서 사용됩니다.
특징:
- 인코딩 차원을 학습을 통해 자동 도출
- 범주 간 유사성(예: '사과'와 '바나나'는 모두 과일)을 벡터 공간에서 표현 가능
- 신경망 모델의 첫 번째 층으로 구현
예시:
from tensorflow.keras.layers import Embedding
embedding_layer = Embedding(input_dim=1000, output_dim=64) # 1000개 카테고리 → 64차원 벡터
✅ 장점: 고차원 데이터에서 우수한 성능, 의미적 구조 학습 가능
❌ 단점: 대량의 데이터와 학습 시간 필요
기법 선택 가이드
인코딩 방식 |
적합한 데이터 유형 |
주요 사용 알고리즘 |
주의사항 |
레이블 인코딩 |
순서형 범주 |
트리 기반 모델 |
명목형 데이터에 사용 금지 |
원-핫 인코딩 |
명목형 (카테고리 수 적음) |
선형 모델, SVM |
차원 폭발 주의 |
타겟 인코딩 |
명목형 (고차원) |
대부분의 회귀/분류 모델 |
정보 누수 방지 필요 |
이진 인코딩 |
고차원 범주형 |
대부분의 모델 |
구현 라이브러리 필요 |
임베딩 |
고차원, 의미 구조 있음 |
딥러닝, NLP 모델 |
학습 필요, 리소스 소모 큼 |
참고 자료 및 관련 문서
🔗 관련 문서: 범주형 데이터 처리, 전처리 기법
데이터 인코딩은 단순한 변환이 아니라, 모델 성능에 직접적인 영향을 미치는 전략적 결정입니다. 데이터의 성격과 모델의 요구사항을 정확히 이해하고, 적절한 인코딩 기법을 선택하는 것이 성공적인 머신러닝 프로젝트의 핵심입니다.
# 데이터 인코딩 기법
데이터 인코딩 기법은 데이터 과학과 머신러닝 프로세스에서 매우 중요한 전처리 단계 중 하나입니다. 실제 데이터는 텍스트, 범주형 값, 날짜, 기호 등 다양한 형태로 존재하지만, 머신러닝 모델은 일반적으로 수치형 데이터만을 입력으로 처리할 수 있습니다. 따라서 범주형 변수나 텍스트 데이터를 모델이 이해할 수 있는 **수치 형태로 변환**하는 과정이 바로 *데이터 인코딩*입니다. 이 문서에서는 대표적인 데이터 인코딩 기법들을 체계적으로 정리하고, 각 기법의 원리, 장단점, 사용 사례를 설명합니다.
---
## 개요
데이터 인코딩은 비수치형 데이터를 수치형으로 변환하여 머신러닝 모델의 학습과 예측을 가능하게 합니다. 특히 범주형 변수(categorical variable)는 종류에 따라 **명목형**(nominal, 순서 없음)과 **순서형**(ordinal, 순서 있음)으로 나뉘며, 각각에 적합한 인코딩 방식을 적용해야 합니다. 잘못된 인코딩은 모델의 성능 저하나 왜곡된 해석을 초래할 수 있으므로, 데이터의 특성과 사용하는 알고리즘을 고려한 신중한 선택이 필요합니다.
---
## 주요 인코딩 기법
### 1. 레이블 인코딩 (Label Encoding)
레이블 인코딩은 범주형 변수의 각 카테고리에 고유한 정수 값을 할당하는 방식입니다.
#### 예시:
| 색상 | 인코딩 후 |
|----------|-----------|
| 빨강 | 0 |
| 파랑 | 1 |
| 초록 | 2 |
#### 특징:
- 간단하고 메모리 효율적
- **순서형 데이터**(예: 소 → 중 → 대)에 적합
- 명목형 데이터에 사용 시 **의미 없는 순서**를 모델이 오해할 수 있음
#### 사용 예:
```python
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
colors = ['red', 'blue', 'green', 'red', 'blue']
encoded_colors = encoder.fit_transform(colors)
```
> ⚠️ 주의: 명목형 데이터에 적용 시 주의가 필요하며, 트리 기반 모델(예: Random Forest, XGBoost)에서만 상대적으로 안전하게 사용 가능.
---
### 2. 원-핫 인코딩 (One-Hot Encoding)
각 범주를 독립적인 이진 열(binary column)로 변환하는 기법입니다. 각 열은 특정 카테고리의 존재 여부를 1 또는 0으로 표시합니다.
#### 예시:
| 색상 | 빨강 | 파랑 | 초록 |
|----------|------|------|------|
| 빨강 | 1 | 0 | 0 |
| 파랑 | 0 | 1 | 0 |
| 초록 | 0 | 0 | 1 |
#### 특징:
- 명목형 데이터에 이상적
- **더미 변수**(dummy variable) 생성
- 카테고리 수가 많을 경우 **차원 증가**(curse of dimensionality) 문제 발생 가능
#### 사용 예:
```python
import pandas as pd
df = pd.DataFrame({'color': ['red', 'blue', 'green']})
one_hot = pd.get_dummies(df, columns=['color'])
```
> ✅ 장점: 모델이 범주 간 순서를 잘못 해석하지 않음
> ❌ 단점: 카테고리가 100개 이상이면 수백 개의 열이 생성되어 비효율적
---
### 3. 범주형 인코딩 (Target Encoding / Mean Encoding)
각 범주의 카테고리 값을 해당 카테고리에 속한 타겟 변수의 평균값으로 대체하는 기법입니다. 주로 회귀 또는 분류 문제에서 사용됩니다.
#### 예시 (이진 분류):
| 지역 | 타겟 평균 (성공률) |
|----------|-------------------|
| 서울 | 0.75 |
| 부산 | 0.60 |
| 대구 | 0.45 |
#### 특징:
- 고차원 데이터에 효과적
- 정보 누수(data leakage) 위험 존재 → 반드시 교차 검증(cross-validation)을 통해 학습/검증 데이터 분리 필요
- 범주 내 샘플 수가 적을 경우 과적합 위험
> ✅ 장점: 범주와 타겟 간 관계를 반영
> ❌ 단점: 오버피팅 가능, 구현 복잡도 ↑
---
### 4. 이진 인코딩 (Binary Encoding)
원-핫 인코딩과 레이블 인코딩의 중간 형태로, 먼저 레이블 인코딩을 수행한 후 그 정수를 이진수로 변환하고, 각 비트를 별도의 열로 분리합니다.
#### 예시 (빨강=0 → 000, 파랑=1 → 001, 초록=2 → 010):
| 색상 | 비트1 | 비트2 | 비트3 |
|------|-------|-------|-------|
| 빨강 | 0 | 0 | 0 |
| 파랑 | 0 | 0 | 1 |
| 초록 | 0 | 1 | 0 |
#### 특징:
- 원-핫보다 차원이 작음 (log₂(n) 개의 열)
- 고차원 범주형 변수에 유리
- 범주 간 잠재적인 유사성 반영 가능
> ✅ 장점: 메모리 효율성과 정보 보존의 균형
> ✅ 활용: 고유값이 많은 범주형 변수 (예: 우편번호, 제품 코드)
---
### 5. 임베딩 (Embedding)
딥러닝 기반 인코딩 기법으로, 범주형 변수를 고정된 길이의 밀집 벡터(dense vector)로 변환합니다. 주로 자연어 처리(NLP)나 추천 시스템에서 사용됩니다.
#### 특징:
- 인코딩 차원을 학습을 통해 자동 도출
- 범주 간 유사성(예: '사과'와 '바나나'는 모두 과일)을 벡터 공간에서 표현 가능
- 신경망 모델의 첫 번째 층으로 구현
#### 예시:
```python
from tensorflow.keras.layers import Embedding
embedding_layer = Embedding(input_dim=1000, output_dim=64) # 1000개 카테고리 → 64차원 벡터
```
> ✅ 장점: 고차원 데이터에서 우수한 성능, 의미적 구조 학습 가능
> ❌ 단점: 대량의 데이터와 학습 시간 필요
---
## 기법 선택 가이드
| 인코딩 방식 | 적합한 데이터 유형 | 주요 사용 알고리즘 | 주의사항 |
|-------------------|------------------------|--------------------------|------------------------------|
| 레이블 인코딩 | 순서형 범주 | 트리 기반 모델 | 명목형 데이터에 사용 금지 |
| 원-핫 인코딩 | 명목형 (카테고리 수 적음)| 선형 모델, SVM | 차원 폭발 주의 |
| 타겟 인코딩 | 명목형 (고차원) | 대부분의 회귀/분류 모델 | 정보 누수 방지 필요 |
| 이진 인코딩 | 고차원 범주형 | 대부분의 모델 | 구현 라이브러리 필요 |
| 임베딩 | 고차원, 의미 구조 있음 | 딥러닝, NLP 모델 | 학습 필요, 리소스 소모 큼 |
---
## 참고 자료 및 관련 문서
- [Scikit-learn Preprocessing Module](https://scikit-learn.org/stable/modules/preprocessing.html)
- [Pandas `get_dummies`](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html)
- **Feature Engineering for Machine Learning**, Alice Zheng, 2018
- **Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow**, Aurélien Géron
> 🔗 관련 문서: [범주형 데이터 처리](/wiki/%EB%B2%94%EC%A3%BC%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC), [전처리 기법](/wiki/%EC%A0%84%EC%B2%98%EB%A6%AC_%EA%B8%B0%EB%B2%95)
---
데이터 인코딩은 단순한 변환이 아니라, 모델 성능에 직접적인 영향을 미치는 전략적 결정입니다. 데이터의 성격과 모델의 요구사항을 정확히 이해하고, 적절한 인코딩 기법을 선택하는 것이 성공적인 머신러닝 프로젝트의 핵심입니다.